﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net.Sockets;
using System.Timers;

namespace 群智感知激励系统服务端底层
{
    public class 用户
    {
        private Stopwatch stopwatch = new Stopwatch();
        public Socket sock;
        public static List<用户> 添加列表 = new List<用户>();
        public static List<用户> 用户列表 = new List<用户>();
        public static List<用户> 删除列表 = new List<用户>();
        public static List<用户> 历史用户 = new List<用户>();
        public List<虚拟货币> 虚拟货币列表 = new List<虚拟货币>();
        public List<用户操作> 操作日志 = new List<用户操作>();
        public double _目标匿名度 = 1.0;
        public List<long> 匿名度图表X = new List<long>();
        public List<double> 匿名度图表Y = new List<double>();
        public 任务 任务;
        public int 已发送数据量 = 0;
        private Random ran = new Random();
        private Timer timer = new Timer();
        private static Hashtable hashtable = new Hashtable();

        public double 目标匿名度
        {
            get
            {
                if (全局.匿名度接管)
                    return 全局.匿名度接管值;
                else
                    return _目标匿名度;
            }
            set
            {
                _目标匿名度 = value;
            }
        }

        public int 临时id
        {
            get; set;
        }

        public 用户(Socket _sock)
        {
            Random ran = new Random();
            int RmNum = hashtable.Count + 1;
            for (int i = 0; hashtable.Count < RmNum; i++)
            {
                临时id = ran.Next(100000000, 1000000000);
                if (!hashtable.ContainsValue(临时id) && 临时id != 0)
                {
                    hashtable.Add(临时id, 临时id);
                }
            }
            sock = _sock;
            stopwatch.Start();
            //信息匿名度图表 = new Series(临时id.ToString() + "的信息匿名度");
            //信息匿名度图表.ChartType = SeriesChartType.Line;
            //信息匿名度图表.BorderWidth = 2;
            //货币匿名度图表 = new Series(临时id.ToString() + "的货币匿名度");
            //货币匿名度图表.ChartType = SeriesChartType.Line;
            //货币匿名度图表.BorderWidth = 2;
            timer.Interval = 1000;
            timer.Elapsed += Timer_Tick; ;
            timer.Start();
        }

        public static void 创建混淆用户(int num)
        {
            for (int i = 0; i < num; i++)
            {
                用户 新用户 = new 用户(null);
                lock (用户.添加列表)
                    用户.添加列表.Add(新用户);
                用户.历史用户.Add(新用户);
                新用户.添加操作日志("用户：" + 新用户.临时id + "已登入");
                系统日志.添加系统日志(新用户.临时id + "已登入");
            }
        }

        private void Timer_Tick(object sender, object e)
        {
            匿名度图表X.Add(全局.stopwatch.ElapsedMilliseconds / 1000);
            匿名度图表Y.Add(联合匿名度());
            lock (虚拟货币列表)
                虚拟货币列表 = 虚拟货币.总表.FindAll(i => i.所属用户 == this);
        }

        public double 在线时间
        {
            get { return (double)stopwatch.ElapsedMilliseconds / 1000; }
        }

        public double 任务完成情况
        {
            get { return 任务.任务完成情况; }
        }

        public int 激励金额
        {
            get { return 任务.激励金额; }
        }

        public double 信息匿名度(int offset = 0)
        {
            return 100.00;
        }

        public double 货币匿名度(int offset = 0)
        {
            if (用户列表.Count < 2)
                return 100;
            if (100.00 - 全局.匿名度变化趋势 * 100 * Math.Pow(已发送数据量 + offset, 2) < 0)
                return 0;
            else
                return 100.00 - 全局.匿名度变化趋势 * 100 * Math.Pow(已发送数据量 + offset, 2);
        }

        public double 联合匿名度(int offset = 0)
        {
            return Math.Min(货币匿名度(offset), 信息匿名度(offset));
        }

        public void 添加操作日志(string 日志信息)
        {
            lock (操作日志)
                操作日志.Add(new 用户操作(this, 日志信息));
        }
    }
}